#include "login.h"
#include "ui_login.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QMessageBox>


login::login(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::login)
{
    ui->setupUi(this);

    connect_flag = 0;
    ui->label_warning->setText("等待连接服务器");

    //定义套接字
    socket = new QTcpSocket(this);
    //连接服务器
    socket->connectToHost(ip_addr,port);

    initfun();
}

login::~login()
{
    delete ui;
    socket->close();
//    disconnect(socket, &QTcpSocket::readyRead, nullptr, nullptr);

}

void login::initfun()
{
    timer_initConn=new QTimer(this);
    timer_reConn=new QTimer(this);

    //定义信号与槽，接收服务器发送的数据
    connect(socket, &QTcpSocket::readyRead, this, &login::readyRead);

    //信号与槽：登录界面定义的socket套接字要通过槽函数发到第二个界面
    connect(this, SIGNAL(send_socket(int, QTcpSocket*, QString, QString, int)), w, SLOT(getLogin_data(int, QTcpSocket*, QString, QString, int)));
    connect(socket,SIGNAL(disconnected()),this,SLOT(isDisConnection()));//断线

    connect(timer_initConn, &QTimer::timeout, this, &login::init_Connect);
    connect(timer_reConn, &QTimer::timeout, this, &login::dis_ReConnect);

    timer_initConn->start(2000);
}


/*初始化链接服务器*/
void login::init_Connect()
{
    // 未连接时，每隔两秒自动向指定服务器发送连接请求
    if(socket->state() == QAbstractSocket::UnconnectedState)
    {
        qDebug()<<"连接状态"<<socket->state();
        socket->abort();
        socket->connectToHost(ip_addr,port);
    }
    // 连接成功后关闭初始化连接定时器
    else if(socket->state() == QAbstractSocket::ConnectedState)
    {
        connect_flag = 1;
        ui->label_warning->setText("服务器已连接!");
        timer_initConn->stop();
//        QMessageBox::information(this,
//                            tr("提示"),
//                            tr("服务器已连接！"),
//                            QMessageBox::Ok,
//                            QMessageBox::Ok);
    }
}


/*服务器断连*/
void login::isDisConnection()
{
    qDebug()<<"*******断开*******";
    connect_flag = 0;
    ui->label_warning->setText("服务器断开!");
    timer_reConn->start(5000);  //开启重连定时器
}

/*断线重连服务器*/
void login::dis_ReConnect()
{
    if(socket->state() == QAbstractSocket::UnconnectedState)
    {
        qDebug()<<"断线重连";
        socket->abort();
        socket->connectToHost(ip_addr,port);
    }
    // 连接成功后关闭初始化连接定时器
    else if(socket->state() == QAbstractSocket::ConnectedState)
    {
        connect_flag = 1;
        ui->label_warning->setText("服务器重连成功!");
        timer_reConn->stop();
//        QMessageBox::information(this,
//                            tr("提示"),
//                            tr("服务器重连成功！"),
//                            QMessageBox::Ok,
//                            QMessageBox::Ok);
    }
}

/*处理服务器转发过来的数据*/
void login::readyRead()
{
    //获取服务器发送的内容
    QByteArray array = socket->readAll();
    //QByteArray转QString
    QString data = array;
    if(data != NULL){
        qDebug() << "接收到服务器数据：" << data;

        /*刚开始连接，服务器返回套接字*/
        if(strstr(data.toUtf8().data(),"connfd:")){
            connfd = atoi(data.mid(data.indexOf(":")+1).toUtf8().data());
            qDebug() << "connfd =" << connfd;
        }
        /*注册成功*/
        else if(data == "regist ok"){
            ui->label_warning->setText("注册成功!");
        }
        /*用户已存在*/
        else if(data == "regist user exist"){
            ui->label_warning->setText("用户名已存在!");             /***以后优化：用户名已存在；服务器不在线；密码位数太少；等等***/
        }
        /*登录成功*/
        else if(data == "ent ok"){
            timer_reConn->stop();
            timer_initConn->stop();
            socket->disconnect();  //关闭本界面的socket信号与槽
            /*切换到主界面*/
            emit send_socket(connfd, socket, name,ip_addr, port); //发送信号
            w->show();       //显示主窗口
            w->init();

//            connect(socket, &QTcpSocket::readyRead, w, &MainWindow::readyRead);
//            connect(socket, &QTcpSocket::disconnected,w,&MainWindow::isDisConnection);//断线
            this->close();   //关闭本窗口
        }
        /*密码错误*/
        else if(data == "passwd error"){
            ui->label_warning->setText("密码错误!");             /***以后优化：用户名错误；密码错误；服务器不在线；等等***/
        }
        /*登录用户不存在*/
        else if(data == "user not exist"){
            ui->label_warning->setText("用户不存在!");
        }
    }
}

/*注册用户*/
void login::on_pushButton_regist_clicked()
{
    if(connect_flag == 0)
        return;
    /*获取用户名和密码*/
    name = ui->lineEdit->text();
    QString passwd = ui->lineEdit_2->text();
    if(passwd == NULL){
        ui->label_warning->setText("密码不能为空!");
        return;
    }

    /*将json注册信息发送到服务器*/
    QJsonObject jsonObject;
    jsonObject.insert("type", "regist");
    jsonObject.insert("name", name);
    jsonObject.insert("passwd", passwd);

    QJsonDocument jsonDocument;
    jsonDocument.setObject(jsonObject);
    QByteArray dataArray = jsonDocument.toJson();

//    qDebug() << jsonObject;
//    qDebug() << dataArray;

    /*将注册信息发送到服务器*/
    socket->write(dataArray);

    /*切换到主界面*/
//    emit send_socket(socket, name); //发送信号
//    w->show();       //显示主窗口
//    this->close();   //关闭本窗口
}

/*登录用户*/
void login::on_pushButton_ent_clicked()
{
    if(connect_flag == 0)
        return;
    /*获取用户名和密码*/
    name = ui->lineEdit->text();
    QString passwd = ui->lineEdit_2->text();

    /*将json登录信息发送到服务器*/
    QJsonObject jsonObject;
    jsonObject.insert("type", "ent");
    jsonObject.insert("name", name);
    jsonObject.insert("passwd", passwd);
    jsonObject.insert("connfd", connfd);

    QJsonDocument jsonDocument;
    jsonDocument.setObject(jsonObject);
    QByteArray dataArray = jsonDocument.toJson();

    //    qDebug() << jsonObject;
    //    qDebug() << dataArray;

    /*将登录信息发送到服务器*/
    socket->write(dataArray);
}
